home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / adg_7_8.zip / SETUPPM.C < prev    next >
C/C++ Source or Header  |  1991-02-21  |  9KB  |  254 lines

  1. /****************************************************************************
  2. Module name: SetupPM.C
  3. Programmer : Jeffrey M. Richter.
  4. *****************************************************************************/
  5.  
  6. #include "..\nowindws.h"
  7. #undef NOATOM
  8. #undef NOKERNEL
  9. #undef NOLSTRING
  10. #undef NOMEMMGR
  11. #undef NOMSG
  12. #undef NOSHOWWINDOW
  13. #undef NOUSER
  14. #undef NOWINMESSAGES
  15. #undef NOWINOFFSETS
  16. #include <windows.h>
  17. #include <dde.h>
  18.  
  19. #include <string.h>
  20.  
  21. #include "Setup.h"
  22. #include "SetupInf.h"
  23.  
  24. char _szClassName[] = "DDEClient";
  25.  
  26. typedef struct {
  27.    HWND hWndServer;
  28. } WNDEB;
  29.  
  30. #define DDE_WAITTIME    3000
  31.  
  32. LONG FAR PASCAL DDEClientWndProc (HWND hWnd, WORD wMsg, WORD wParam, LONG lParam) {
  33.    DWORD dwResult = 0, dwStopTime;
  34.    BOOL fCallDefProc = FALSE;
  35.    HWND hWndServer = (HWND) GETWNDEB(hWnd, WNDEB, hWndServer);
  36.    char szBuf[100]; MSG Msg;
  37.  
  38.    switch (wMsg) {
  39.  
  40.       case WM_NCCREATE:
  41.          dwResult = DefWindowProc(hWnd, wMsg, wParam, lParam);
  42.          if (dwResult == NULL) break;
  43.  
  44.          SendMessage(-1, WM_DDE_INITIATE, hWnd,
  45.             (LONG) ((LPCREATESTRUCT) lParam)->lpCreateParams);
  46.  
  47.          if (GETWNDEB(hWnd, WNDEB, hWndServer) != NULL)
  48.             break;
  49.  
  50.          // A conversation was not able to be established. Attempt to 
  51.          // execute the desired application.
  52.          GlobalGetAtomName(LOWORD((LONG) ((LPCREATESTRUCT) lParam)->lpCreateParams),
  53.             szBuf, sizeof(szBuf));
  54.          WinExec(szBuf, SW_RESTORE);
  55.  
  56.          SendMessage(-1, WM_DDE_INITIATE, hWnd,
  57.             (LONG) ((LPCREATESTRUCT) lParam)->lpCreateParams);
  58.  
  59.          if (GETWNDEB(hWnd, WNDEB, hWndServer) == NULL)
  60.             DefWindowProc(hWnd, WM_NCDESTROY, wParam, lParam);
  61.  
  62.          break;
  63.  
  64.       case WM_DESTROY:
  65.          PostMessage(hWndServer, WM_DDE_TERMINATE, hWnd, 0);
  66.          SETWNDEB(hWnd, WNDEB, hWndServer, NULL);
  67.          // From now on, do not send a WM_DDE_ACK message to the server in 
  68.          // response to any messages sent from the Server.
  69.  
  70.          // Wait for response from the Server.
  71.          dwStopTime = GetTickCount() + DDE_WAITTIME;
  72.          do {
  73.             if (PeekMessage(&Msg, hWnd, WM_DDE_TERMINATE, WM_DDE_TERMINATE,
  74.                PM_REMOVE)) break;
  75.  
  76.          } while (GetTickCount() < dwStopTime);
  77.          break;
  78.  
  79.       case WM_DDE_DATA:
  80.          if (hWndServer != (HWND) wParam) {
  81.             // Conversation not initiated with this Server or Server sent
  82.             // after we have terminated the conversation.
  83.             if (HIWORD(lParam) != NULL) {
  84.                // Data handle is not.  If it were NULL, a link was set 
  85.                // using the WM_DDE_ADVISE message.
  86.                GlobalFree(HIWORD(lParam));
  87.             }
  88.             GlobalDeleteAtom(LOWORD(lParam));
  89.          }
  90.          break;
  91.  
  92.       case WM_DDE_EXECUTE:
  93.          // Because this is a Client and NOT a Server, this message was 
  94.          // sent to this window from the Setup Application.  The lParam
  95.          // parameter contains the handle of the memory containing the
  96.          // commands to be executed by the Server.
  97.  
  98.          // Verify that a conversation was started and hasn't been terminated.
  99.          if (hWndServer == NULL) break;
  100.  
  101.          PostMessage(hWndServer, wMsg, hWnd, lParam);
  102.  
  103.          // Wait for response from the Server.
  104.          GetMessage(&Msg, hWnd, WM_DDE_ACK, WM_DDE_ACK);
  105.  
  106.          // Return whether the command was acknowledged successfully.
  107.          wParam = LOWORD(Msg.lParam);
  108.          dwResult = ((DDEACK *) &wParam)->fAck;
  109.          break;
  110.  
  111.       case WM_DDE_TERMINATE:
  112.          if (hWndServer == NULL) break;
  113.          // The Server has terminated the conversation with us.
  114.          // We must send the WM_DDE_TERMINATE message back to the server.
  115.          PostMessage(hWndServer, WM_DDE_TERMINATE, hWnd, 0);
  116.          SETWNDEB(hWnd, WNDEB, hWndServer, (HWND) NULL);
  117.          break;
  118.  
  119.       case WM_DDE_ACK:
  120.          if (hWndServer == NULL) {
  121.             // No conversation initiated, WM_DDE_ACK must be from a
  122.             // potential server that just received my WM_DDE_INITIATE message.
  123.             SETWNDEB(hWnd, WNDEB, hWndServer, (HWND) wParam);
  124.             break;
  125.          }
  126.  
  127.          // WM_DDE_ACK message received from a potential Server but we have 
  128.          // already established a conversation with another Server.  Tell the 
  129.          // Server that we do not wish to continue our conversation with it. 
  130.          PostMessage((HWND) wParam, WM_DDE_TERMINATE, hWnd, 0);
  131.          break;
  132.  
  133.       default:
  134.          fCallDefProc = TRUE;
  135.       break;
  136.    }
  137.  
  138.    if (fCallDefProc)
  139.       dwResult = DefWindowProc(hWnd, wMsg, wParam, lParam);
  140.  
  141.    return(dwResult);
  142. }
  143.  
  144.  
  145. BOOL FAR PASCAL RegisterDDEClient (HANDLE hInstance) {
  146.    WNDCLASS wc;
  147.    wc.style = 0;
  148.    wc.cbClsExtra = 0;
  149.    wc.cbWndExtra = sizeof(WNDEB);
  150.    wc.lpfnWndProc = DDEClientWndProc;
  151.    wc.hInstance = hInstance;
  152.    wc.hIcon = NULL;
  153.    wc.hCursor = NULL;
  154.    wc.hbrBackground = NULL;
  155.    wc.lpszMenuName = NULL;
  156.    wc.lpszClassName = _szClassName;
  157.    return(RegisterClass(&wc));
  158. }
  159.  
  160.  
  161. // ********** Functions for adding files to the Program Manager **************
  162.  
  163. BOOL NEAR PASCAL CreatePMInfo (HANDLE hInstance) {
  164.    int nDirIndex, nPMProg, nMaxPMProgs;
  165.    DWORD dwTemp;
  166.    BOOL fOk;
  167.    char szPMGroup[100], szPMGroupFileName[100];
  168.    char szPMProgName[100], szPMProgDesc[100], szPMIconFileName[100];
  169.    char szBuf[100], szBuf2[100], szCmd[100], szProgMan[] = "PROGMAN";
  170.    HWND hWndDDEClient, hWndPM;
  171.    ATOM aApp, aTopic;
  172.    GLOBALHANDLE hMem; LPSTR lpCommand;
  173.  
  174.    // Initiate a conversation with the Program Manager.
  175.    aApp = GlobalAddAtom(szProgMan);
  176.    aTopic = GlobalAddAtom(szProgMan);
  177.    hWndDDEClient = CreateWindow("DDEClient", "", 0, 0, 0, 0, 0,
  178.       NULL, NULL, hInstance, (LPSTR) MAKELONG(aApp, aTopic));
  179.    GlobalDeleteAtom(aApp);
  180.    GlobalDeleteAtom(aTopic);
  181.  
  182.    if (hWndDDEClient == NULL) {
  183.       // Conversation could not be initiated.
  184.       return(FALSE);
  185.    }
  186.  
  187.    // Force the Program Manager to open so that the user can 
  188.    // see what group and applications we are adding.
  189.  
  190.    // Notice that I use the FindWindow function here.  I can not use the
  191.    // window handle of the DDE Server window because the Program Manager
  192.    // could acknowledge our DDE conversation by creating a "DDEServer" 
  193.    // window.  Calling the ShowWindow function and using this handle would 
  194.    // make the "DDEServer" window visible, this is definitely NOT desirable.
  195.    ShowWindow(hWndPM = FindWindow(szProgMan, NULL), SW_RESTORE);
  196.  
  197.    // Disable the Program Manager so that the user can't work with it
  198.    // while we are doing our stuff.
  199.    EnableWindow(FindWindow(szProgMan, NULL), FALSE);
  200.  
  201.    // Create the PM Group box.
  202.    SetupInfoSys(SIM_GETPMGROUP, 0, szPMGroup);
  203.    SetupInfoSys(SIM_GETPMGROUPFILENAME, 0, szPMGroupFileName);
  204.    wsprintf(szCmd, "[CreateGroup(%s%s%s)]",
  205.       (LPSTR) szPMGroup, (LPSTR) (*szPMGroupFileName == 0 ? "" : ","),
  206.       (LPSTR) szPMGroupFileName);
  207.  
  208.    hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, lstrlen(szCmd) + 1);
  209.    lpCommand = GlobalLock(hMem);
  210.    lstrcpy(lpCommand, szCmd);
  211.    GlobalUnlock(hMem);
  212.  
  213.    fOk = (BOOL) SendMessage(hWndDDEClient, WM_DDE_EXECUTE, 0, MAKELONG(0, hMem));
  214.    GlobalFree(hMem);
  215.  
  216.    // Add the individual PM files to the Group box.
  217.    nMaxPMProgs = (int) SetupInfoSys(SIM_GETNUMPMPROGS, 0, 0);
  218.    for (nPMProg = 0; fOk && (nPMProg < nMaxPMProgs); nPMProg++) {
  219.       SetupInfoSys(SIM_GETPMPROGDESC, nPMProg, szPMProgDesc);
  220.       nDirIndex = (int) SetupInfoSys(SIM_GETPMPROGNAME, nPMProg, szPMProgName);
  221.  
  222.       // Calculate the top of the destination directory path.
  223.       wsprintf(szBuf, "%s%s", (LPSTR) _szDstDir, (LPSTR) 
  224.          ((*(_fstrrchr(_szDstDir, '\\') + 1) == 0) ? "" : "\\"));
  225.       lstrcpy(szBuf2, szBuf);
  226.  
  227.       // Append the sub-directory where the file is and the file's name.
  228.       SetupInfoSys(SIM_GETDIR, nDirIndex, _fstrchr(szBuf, 0));
  229.       lstrcat(szBuf, "\\");
  230.       lstrcat(szBuf, szPMProgName);
  231.  
  232.       // Append the subdir where the icon file is and the icon file's name.
  233.       dwTemp = SetupInfoSys(SIM_GETPMICONINFO, nPMProg, szPMIconFileName);
  234.       SetupInfoSys(SIM_GETDIR, LOWORD(dwTemp), _fstrchr(szBuf2, 0));
  235.       lstrcat(szBuf2, "\\");
  236.       lstrcat(szBuf2, szPMIconFileName);
  237.  
  238.       // Add the new file to the already created PM Group.
  239.       wsprintf(szCmd, "[AddItem(%s,%s,%s,%d)]", (LPSTR) szBuf,
  240.          (LPSTR) szPMProgDesc, (LPSTR) szBuf2, HIWORD(dwTemp));
  241.       hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, lstrlen(szCmd) + 1);
  242.       lpCommand = GlobalLock(hMem);
  243.       lstrcpy(lpCommand, szCmd);
  244.       GlobalUnlock(hMem);
  245.  
  246.       fOk = (BOOL) SendMessage(hWndDDEClient, WM_DDE_EXECUTE, 0, MAKELONG(0, hMem));
  247.       GlobalFree(hMem);
  248.    }
  249.    // Terminate the DDE conversation with the Program Manager.
  250.    DestroyWindow(hWndDDEClient);
  251.    EnableWindow(hWndPM, TRUE);
  252.    return(fOk);
  253. }
  254.